# -*- coding:utf-8 -*-
#本程序用于边缘检测
import cv2  #导入opencv模块
import numpy as np

print("Hellow word!")     #打印“Hello word！”，验证模块导入成功

img = cv2.imread("lena.jpg")  #导入图片，图片放在程序所在目录
cv2.namedWindow("imagshow", 2)   #创建一个窗口
cv2.imshow('imagshow', img)    #显示原始图片

#高斯模糊
blurred = cv2.GaussianBlur(img, (3, 3), 0)
#转换为灰度图
out_img_GRAY=cv2.cvtColor(blurred,cv2.COLOR_BGR2GRAY)#将图片转换为灰度图
cv2.namedWindow("img_GRAY", 2)   #创建一个窗口
cv2.imshow('img_GRAY', out_img_GRAY)    #显示原始图片


#使用Canny算子进行边缘检测
edge_output = cv2.Canny(out_img_GRAY, 10, 300)
cv2.namedWindow("Canny", 2)   #创建一个窗口
cv2.imshow('Canny', edge_output)    #显示原始图片


#使用sobelx算子进行边缘检测
sobelx = cv2.Sobel(out_img_GRAY,-1,1,0,ksize=3)
cv2.namedWindow("sobelx", 2)   #创建一个窗口
cv2.imshow('sobelx', sobelx)    #显示原始图片


#使用laplacian算子进行边缘检测
laplacian = cv2.Laplacian(out_img_GRAY,-1)
cv2.namedWindow("laplacian", 2)   #创建一个窗口
cv2.imshow('laplacian', laplacian)    #显示原始图片

"""
#使用laplacian算子进行边缘检测
laplacian = cv2.Log(out_img_GRAY,-1)
cv2.namedWindow("laplacian", 2)   #创建一个窗口
cv2.imshow('laplacian', laplacian)    #显示原始图片
"""
cv2.waitKey()

"""
# 利用Sobel方法可以进行sobel边缘检测
# img表示源图像，即进行边缘检测的图像
# cv2.CV_64F表示64位浮点数即64float。
# 这里不使用numpy.float64，因为可能会发生溢出现象。用cv的数据则会自动
# 第三和第四个参数分别是对X和Y方向的导数（即dx,dy），对于图像来说就是差分，这里1表示对X求偏导（差分），0表示不对Y求导（差分）。其中，X还可以求2次导。
# 注意：对X求导就是检测X方向上是否有边缘。
# 第五个参数ksize是指核的大小。
"""


"""
OpenCV的Canny函数用于在图像中查找边缘，其函数原型有两种：
①直接调用Canny算法在单通道灰度图像中查找边缘，
其函数原型为：Canny(image, threshold1, threshold2[, edges[, apertureSize[, L2gradient]]]) -> edges
image参数表示8位输入图像。
threshold1参数表示设置的低阈值。
threshold2参数表示设置的高阈值，一般设定为低阈值的3倍 (根据Canny算法的推荐)。
edges参数表示输出边缘图像，单通道8位图像。
apertureSize参数表示Sobel算子的大小。
L2gradient参数表示一个布尔值，如果为真，则使用更精确的L2范数进行计算（即两个方向的倒数的平方和再开方），
否则使用L1范数（直接将两个方向导数的绝对值相加）。
②使用带自定义图像渐变的Canny算法在图像中查找边缘，
其函数原型为：Canny(dx, dy, threshold1, threshold2[, edges[, L2gradient]]) -> edges
dx参数表示输入图像的x导数（x导数满足16位，选择CV_16SC1或CV_16SC3）
dy参数表示输入图像的y导数（y导数满足16位，选择CV_16SC1或CV_16SC3）。
threshold1参数表示设置的低阈值。
threshold2参数表示设置的高阈值，一般设定为低阈值的3倍 (根据Canny算法的推荐)。
edges参数表示输出边缘图像，单通道8位图像。
L2gradient参数表示L2gradient参数表示一个布尔值，如果为真，则使用更精确的L2范数进行计算（即两个方向的倒数的
平方和再开方），否则使用L1范数（直接将两个方向导数的绝对值相加）。
"""
